{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "#首先 import 必要的模块\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pregnants</th>\n",
       "      <th>Plasma_glucose_concentration</th>\n",
       "      <th>blood_pressure</th>\n",
       "      <th>Triceps_skin_fold_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>Diabetes_pedigree_function</th>\n",
       "      <th>Age</th>\n",
       "      <th>Triceps_skin_fold_thickness_Missing</th>\n",
       "      <th>serum_insulin_Missing</th>\n",
       "      <th>Target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.639947</td>\n",
       "      <td>0.866045</td>\n",
       "      <td>-0.031990</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>0.166619</td>\n",
       "      <td>0.468492</td>\n",
       "      <td>1.425995</td>\n",
       "      <td>-0.647760</td>\n",
       "      <td>1.026390</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.205066</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-0.852200</td>\n",
       "      <td>-0.365061</td>\n",
       "      <td>-0.190672</td>\n",
       "      <td>-0.647760</td>\n",
       "      <td>1.026390</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.233880</td>\n",
       "      <td>2.016662</td>\n",
       "      <td>-0.693761</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-1.332500</td>\n",
       "      <td>0.604397</td>\n",
       "      <td>-0.105584</td>\n",
       "      <td>1.543781</td>\n",
       "      <td>1.026390</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.073567</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.695245</td>\n",
       "      <td>-0.540642</td>\n",
       "      <td>-0.633881</td>\n",
       "      <td>-0.920763</td>\n",
       "      <td>-1.041549</td>\n",
       "      <td>-0.647760</td>\n",
       "      <td>-0.974289</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.141852</td>\n",
       "      <td>0.504422</td>\n",
       "      <td>-2.679076</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>0.316566</td>\n",
       "      <td>1.549303</td>\n",
       "      <td>5.484909</td>\n",
       "      <td>-0.020496</td>\n",
       "      <td>-0.647760</td>\n",
       "      <td>-0.974289</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   pregnants  Plasma_glucose_concentration  blood_pressure  \\\n",
       "0   0.639947                      0.866045       -0.031990   \n",
       "1  -0.844885                     -1.205066       -0.528319   \n",
       "2   1.233880                      2.016662       -0.693761   \n",
       "3  -0.844885                     -1.073567       -0.528319   \n",
       "4  -1.141852                      0.504422       -2.679076   \n",
       "\n",
       "   Triceps_skin_fold_thickness  serum_insulin       BMI  \\\n",
       "0                     0.670643      -0.181541  0.166619   \n",
       "1                    -0.012301      -0.181541 -0.852200   \n",
       "2                    -0.012301      -0.181541 -1.332500   \n",
       "3                    -0.695245      -0.540642 -0.633881   \n",
       "4                     0.670643       0.316566  1.549303   \n",
       "\n",
       "   Diabetes_pedigree_function       Age  Triceps_skin_fold_thickness_Missing  \\\n",
       "0                    0.468492  1.425995                            -0.647760   \n",
       "1                   -0.365061 -0.190672                            -0.647760   \n",
       "2                    0.604397 -0.105584                             1.543781   \n",
       "3                   -0.920763 -1.041549                            -0.647760   \n",
       "4                    5.484909 -0.020496                            -0.647760   \n",
       "\n",
       "   serum_insulin_Missing  Target  \n",
       "0               1.026390       1  \n",
       "1               1.026390       0  \n",
       "2               1.026390       1  \n",
       "3              -0.974289       0  \n",
       "4              -0.974289       1  "
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train = pd.read_csv(\"E:\\\\Jupyter\\\\TZ_pima-indians-diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pregnants</th>\n",
       "      <th>Plasma_glucose_concentration</th>\n",
       "      <th>blood_pressure</th>\n",
       "      <th>Triceps_skin_fold_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>Diabetes_pedigree_function</th>\n",
       "      <th>Age</th>\n",
       "      <th>Triceps_skin_fold_thickness_Missing</th>\n",
       "      <th>serum_insulin_Missing</th>\n",
       "      <th>Target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2.544261e-17</td>\n",
       "      <td>1.474515e-17</td>\n",
       "      <td>-3.321273e-17</td>\n",
       "      <td>-1.888680e-16</td>\n",
       "      <td>2.941802e-17</td>\n",
       "      <td>2.815312e-16</td>\n",
       "      <td>2.422108e-16</td>\n",
       "      <td>1.528002e-16</td>\n",
       "      <td>1.078420e-16</td>\n",
       "      <td>6.881070e-17</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-1.141852e+00</td>\n",
       "      <td>-2.552931e+00</td>\n",
       "      <td>-4.002619e+00</td>\n",
       "      <td>-2.516429e+00</td>\n",
       "      <td>-1.467353e+00</td>\n",
       "      <td>-2.074783e+00</td>\n",
       "      <td>-1.189553e+00</td>\n",
       "      <td>-1.041549e+00</td>\n",
       "      <td>-6.477603e-01</td>\n",
       "      <td>-9.742888e-01</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>-8.448851e-01</td>\n",
       "      <td>-7.201630e-01</td>\n",
       "      <td>-6.937615e-01</td>\n",
       "      <td>-4.675972e-01</td>\n",
       "      <td>-2.220849e-01</td>\n",
       "      <td>-7.212087e-01</td>\n",
       "      <td>-6.889685e-01</td>\n",
       "      <td>-7.862862e-01</td>\n",
       "      <td>-6.477603e-01</td>\n",
       "      <td>-9.742888e-01</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>-2.509521e-01</td>\n",
       "      <td>-1.530732e-01</td>\n",
       "      <td>-3.198993e-02</td>\n",
       "      <td>-1.230129e-02</td>\n",
       "      <td>-1.815412e-01</td>\n",
       "      <td>-2.258989e-02</td>\n",
       "      <td>-3.001282e-01</td>\n",
       "      <td>-3.608474e-01</td>\n",
       "      <td>-6.477603e-01</td>\n",
       "      <td>-9.742888e-01</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.399473e-01</td>\n",
       "      <td>6.112653e-01</td>\n",
       "      <td>6.297816e-01</td>\n",
       "      <td>3.291706e-01</td>\n",
       "      <td>-1.554775e-01</td>\n",
       "      <td>6.032562e-01</td>\n",
       "      <td>4.662269e-01</td>\n",
       "      <td>6.602056e-01</td>\n",
       "      <td>1.543781e+00</td>\n",
       "      <td>1.026390e+00</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>3.906578e+00</td>\n",
       "      <td>2.542658e+00</td>\n",
       "      <td>4.104082e+00</td>\n",
       "      <td>7.955377e+00</td>\n",
       "      <td>8.170442e+00</td>\n",
       "      <td>5.042397e+00</td>\n",
       "      <td>5.883565e+00</td>\n",
       "      <td>4.063716e+00</td>\n",
       "      <td>1.543781e+00</td>\n",
       "      <td>1.026390e+00</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          pregnants  Plasma_glucose_concentration  blood_pressure  \\\n",
       "count  7.680000e+02                  7.680000e+02    7.680000e+02   \n",
       "mean   2.544261e-17                  1.474515e-17   -3.321273e-17   \n",
       "std    1.000652e+00                  1.000652e+00    1.000652e+00   \n",
       "min   -1.141852e+00                 -2.552931e+00   -4.002619e+00   \n",
       "25%   -8.448851e-01                 -7.201630e-01   -6.937615e-01   \n",
       "50%   -2.509521e-01                 -1.530732e-01   -3.198993e-02   \n",
       "75%    6.399473e-01                  6.112653e-01    6.297816e-01   \n",
       "max    3.906578e+00                  2.542658e+00    4.104082e+00   \n",
       "\n",
       "       Triceps_skin_fold_thickness  serum_insulin           BMI  \\\n",
       "count                 7.680000e+02   7.680000e+02  7.680000e+02   \n",
       "mean                 -1.888680e-16   2.941802e-17  2.815312e-16   \n",
       "std                   1.000652e+00   1.000652e+00  1.000652e+00   \n",
       "min                  -2.516429e+00  -1.467353e+00 -2.074783e+00   \n",
       "25%                  -4.675972e-01  -2.220849e-01 -7.212087e-01   \n",
       "50%                  -1.230129e-02  -1.815412e-01 -2.258989e-02   \n",
       "75%                   3.291706e-01  -1.554775e-01  6.032562e-01   \n",
       "max                   7.955377e+00   8.170442e+00  5.042397e+00   \n",
       "\n",
       "       Diabetes_pedigree_function           Age  \\\n",
       "count                7.680000e+02  7.680000e+02   \n",
       "mean                 2.422108e-16  1.528002e-16   \n",
       "std                  1.000652e+00  1.000652e+00   \n",
       "min                 -1.189553e+00 -1.041549e+00   \n",
       "25%                 -6.889685e-01 -7.862862e-01   \n",
       "50%                 -3.001282e-01 -3.608474e-01   \n",
       "75%                  4.662269e-01  6.602056e-01   \n",
       "max                  5.883565e+00  4.063716e+00   \n",
       "\n",
       "       Triceps_skin_fold_thickness_Missing  serum_insulin_Missing      Target  \n",
       "count                         7.680000e+02           7.680000e+02  768.000000  \n",
       "mean                          1.078420e-16           6.881070e-17    0.348958  \n",
       "std                           1.000652e+00           1.000652e+00    0.476951  \n",
       "min                          -6.477603e-01          -9.742888e-01    0.000000  \n",
       "25%                          -6.477603e-01          -9.742888e-01    0.000000  \n",
       "50%                          -6.477603e-01          -9.742888e-01    0.000000  \n",
       "75%                           1.543781e+00           1.026390e+00    1.000000  \n",
       "max                           1.543781e+00           1.026390e+00    1.000000  "
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 11 columns):\n",
      "pregnants                              768 non-null float64\n",
      "Plasma_glucose_concentration           768 non-null float64\n",
      "blood_pressure                         768 non-null float64\n",
      "Triceps_skin_fold_thickness            768 non-null float64\n",
      "serum_insulin                          768 non-null float64\n",
      "BMI                                    768 non-null float64\n",
      "Diabetes_pedigree_function             768 non-null float64\n",
      "Age                                    768 non-null float64\n",
      "Triceps_skin_fold_thickness_Missing    768 non-null float64\n",
      "serum_insulin_Missing                  768 non-null float64\n",
      "Target                                 768 non-null int64\n",
      "dtypes: float64(10), int64(1)\n",
      "memory usage: 66.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train['Target']   \n",
    "X_train = train.drop([ \"Target\"], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "lr = LogisticRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is:  [0.48753578 0.53076598 0.45433853 0.42098118 0.47917703]\n",
      "cv logloss is: 0.4745597003175165\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "loss = cross_val_score(lr, X_train, y_train, cv=5, scoring='neg_log_loss')\n",
    "print ('logloss of each fold is: ',-loss)\n",
    "print('cv logloss is:', -loss.mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise-deprecating',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='warn',\n",
       "          n_jobs=None, penalty='l2', random_state=None, solver='liblinear',\n",
       "          tol=0.0001, verbose=0, warm_start=False),\n",
       "       fit_params=None, iid='warn', n_jobs=4,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "#需要调优的参数\n",
    "# 请尝试将L1正则和L2正则分开，并配合合适的优化求解算法（slover）\n",
    "#tuned_parameters = {'penalty':['l1','l2'],\n",
    "#                   'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "#                   }\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression(solver='liblinear')\n",
    "grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5, scoring='neg_log_loss',n_jobs = 4,)\n",
    "grid.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.47423198486794166\n",
      "{'C': 1, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    plt.errorbar(x_axis, -test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    plt.errorbar(x_axis, -train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "plt.legend()\n",
    "plt.xlabel( 'log(C)' )                                                                                                      \n",
    "plt.ylabel( 'logloss' )\n",
    "plt.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle as pk\n",
    "pk.dump(grid.best_estimator_, open(\"E:\\\\Jupyter\\\\Diabetes_L1_org.pkl\", 'wb'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
